Banco de Dados

Aula 05 - SQL I: Construindo o Banco (DDL)




Helder Jefferson Ferreira da Luz

helder.luz@ifpr.edu.br

Objetivos da aula

  • Conhecer a linguagem SQL
  • Aprender a sub-linguagem DDL para definir a estrutura das tabelas.
  • Conhecer alguns tipos de dados para armazenamento no BD.

SQL

SQL (Structured Query Language) é a linguagem padrão para interagir com bancos de dados relacionais.

  • É uma linguagem declarativa: Você diz o que quer, não como fazer.
  • É padronizada (ANSI/ISO): Os comandos básicos são os mesmos no MySQL, PostgreSQL, SQL Server, etc. (Agnóstica!)
  • Possui "sub-linguagens" para diferentes tipos de tarefas.

As Sub-linguagens do SQL

  • DDL (Data Definition Language): Define e gerencia a estrutura do BD.
    • CREATE, ALTER, DROP
  • DML (Data Manipulation Language): Manipula os dados.
    • INSERT, UPDATE, DELETE.
  • DQL (Data Query Language): Consulta os dados.
    • SELECT.
  • DCL (Data Control Language): Gerencia permissões.
    • GRANT, REVOKE.

Nessa aula o foco é DDL.

Tipos de Dados Comuns

Todo dado em uma coluna precisa ter um tipo. Os tipos padrão (agnósticos) mais comuns são:

Categoria Tipos Comuns Descrição
Numéricos INTEGER ou INT Números inteiros.
NUMERIC(p, s) ou DECIMAL(p, s) Números decimais com precisão p e s casas decimais. Ex: NUMERIC(10, 2) para preços.
Texto CHAR(n) String de tamanho fixo n.
VARCHAR(n) String de tamanho variável até n. O mais usado para textos.
TEXT Para textos longos, sem limite definido.
Data/Hora DATE Armazena data (YYYY-MM-DD).
TIME Armazena hora (HH:MM:SS).
TIMESTAMP ou DATETIME Armazena data e hora juntos.
Lógicos BOOLEAN Armazena TRUE ou FALSE.

DDL

Data Definition Language

CREATE ALTER DROP

DDL: Começando pelo Começo

Antes de criar tabelas, é necessário um lugar para colocá-las: um banco de dados.

1. Criando o Banco de Dados

CREATE DATABASE nome_do_banco;

Este comando cria um novo "container" para as tabelas.

2. Selecionando o Banco de Dados
Depois de criar, você precisa "entrar" no banco para poder trabalhar nele.

-- No MySQL / MariaDB
USE nome_do_banco;

A partir daqui, todos os comandos serão executados dentro deste banco de dados.

CREATE TABLE: Construindo a Estrutura

O comando CREATE TABLE cria uma nova tabela no banco de dados.

Sintaxe básica:

CREATE TABLE nome_da_tabela (
    nome_coluna1 tipo_de_dado [constraints],
    nome_coluna2 tipo_de_dado [constraints],
    ...
    [constraints_de_tabela]
);

Constraints (Restrições) são regras aplicadas às colunas para garantir a integridade dos dados.

Constraints Essenciais

  • NOT NULL: A coluna não pode ter valores nulos.
  • UNIQUE: Todos os valores na coluna devem ser únicos.
  • PRIMARY KEY: Define a coluna como chave primária (NOT NULL e UNIQUE são implícitos).
  • FOREIGN KEY: Cria um relacionamento com a chave primária de outra tabela.
  • DEFAULT valor: Define um valor padrão para a coluna se nenhum for fornecido.
  • CHECK (condição): Garante que os valores satisfaçam uma condição.

Exemplo: Criando a Tabela CLIENTE

Vamos traduzir nosso modelo ER para SQL.

Modelo: CLIENTE { int id PK, string nome, string email, string cpf }

SQL:

CREATE TABLE cliente (
  id INTEGER PRIMARY KEY AUTO_INCREMENT, 
  nome VARCHAR(100) NOT NULL,
  email VARCHAR(100) UNIQUE NOT NULL,
  cpf CHAR(11) UNIQUE NOT NULL,
  data_nascimento DATE
);

Nota: A forma de auto-incremento da PK varia. No PostgreSQL é SERIAL ou GENERATED AS IDENTITY.

Exemplo: PRODUTO

Tabela PRODUTO:

CREATE TABLE produto (
  id INTEGER PRIMARY KEY, -- ou AUTO_INCREMENT / SERIAL
  nome VARCHAR(100) NOT NULL,
  descricao TEXT,
  preco NUMERIC(10, 2) NOT NULL CHECK (preco > 0)
);

Exemplo: PEDIDO

Tabela PEDIDO (com a Foreign Key):

CREATE TABLE pedido (
  id INTEGER PRIMARY KEY, -- ou AUTO_INCREMENT / SERIAL
  data_pedido TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  status VARCHAR(20) DEFAULT 'Pendente',
  id_cliente INTEGER NOT NULL,

  FOREIGN KEY (id_cliente) REFERENCES cliente(id)
);

A FOREIGN KEY garante que todo id_cliente na tabela pedido deve existir na tabela cliente.

Exemplo: A Tabela de Junção ITEM_PEDIDO

Lembre-se que a PK aqui é composta.

CREATE TABLE item_pedido (
  id_pedido INTEGER NOT NULL,
  id_produto INTEGER NOT NULL,
  quantidade INTEGER NOT NULL DEFAULT 1,
  preco_unitario NUMERIC(10, 2) NOT NULL,

  PRIMARY KEY (id_pedido, id_produto),
  FOREIGN KEY (id_pedido) REFERENCES pedido(id),
  FOREIGN KEY (id_produto) REFERENCES produto(id)
);

Isso implementa o relacionamento N:M e garante a integridade referencial.

ALTER TABLE: Modificando o que já existe

E se você esqueceu uma coluna ou precisa mudar um tipo de dado?

  • Adicionar uma coluna:

    ALTER TABLE cliente ADD COLUMN data_cadastro DATE;
    
  • Remover uma coluna:

    ALTER TABLE cliente DROP COLUMN data_cadastro;
    
  • Modificar tipo de dado de uma coluna:

    ALTER TABLE cliente MODIFY COLUMN nome VARCHAR(150);
    

    (Sintaxe pode variar: no PostgreSQL é ALTER COLUMN ... TYPE ...)

ALTER TABLE: Modificando o que já existe

  • Adicionar uma CONSTRAINT (como uma Foreign Key):
ALTER TABLE pedido 
  ADD CONSTRAINT fk_cliente FOREIGN KEY (id_cliente) REFERENCES cliente(id);
  • Múltiplas modificações de uma vez
ALTER TABLE pedido
  ADD COLUMN id_cliente INTEGER,
  ADD CONSTRAINT fk_cliente
    FOREIGN KEY (id_cliente) REFERENCES cliente(id);

(A sintaxe para múltiplas ações pode variar um pouco entre SGBDs)

DROP TABLE: Removendo uma Tabela

Cuidado: este comando é permanente e apaga a tabela e todos os seus dados!

DROP TABLE nome_da_tabela;

Você não conseguirá apagar uma tabela se outra depender dela por uma FOREIGN KEY. Você precisaria apagar a tabela dependente primeiro.

Dúvidas? 🤔

Exercícios

  1. Crie a Tabela CATEGORIA: Escreva o comando CREATE TABLE para uma tabela categoria com as colunas:
    • id (inteiro, chave primária)
    • nome (texto de até 50 caracteres, único e não nulo)
    • descricao (texto longo)
  1. Altere a Tabela PRODUTO: Escreva o comando ALTER TABLE para adicionar uma chave estrangeira na tabela produto que se relacione com a tabela categoria. Chame a nova coluna de id_categoria.

Exercícios

  1. Relacionamento 1:1: Escreva o CREATE TABLE para uma tabela endereco_entrega que se relaciona com CLIENTE (um cliente tem um endereço de entrega). A tabela deve ter id, logradouro, numero, cidade, cep e a FK para cliente.

Diagrama final

- **Sub-linguagens do SQL**: DDL, DML, DQL e DCL.

- **Comandos Essenciais**: `CREATE TABLE`, `ALTER TABLE`, `DROP TABLE`. - **Constraints**: Impondo regras nos seus dados (`PRIMARY KEY`, `FOREIGN KEY`, `NOT NULL`). - **Mão na Massa**: Escrevendo o SQL para criar as tabelas da nossa Loja.

: A Língua Universal dos Bancos de Dados

(para `DATABASE`, `TABLE`, `INDEX`, etc.)

-- No PostgreSQL (via psql) \c nome_do_banco;

```mermaid erDiagram CLIENTE { int id PK string nome string email string cpf } ```

CREATE TABLE categoria ( id INTEGER PRIMARY KEY AUTO_INCREMENT, nome VARCHAR(50) UNIQUE NOT NULL, descricao TEXT )

ALTER TABLE produto ADD COLUMN id_categoria INT; ALTER TABLE produto ADD CONSTRAINT fk_categoria FOREIGN KEY (id_categoria) REFERENCES categoria(id); **** versão com um único comando **** ALTER TABLE produto ADD COLUMN id_categoria INT, ADD CONSTRAINT fk_categoria FOREIGN KEY (id_categoria) REFERENCES categoria(id);

CREATE TABLE endereco_entrega ( id_cliente INTEGER PRIMARY KEY, logradouro VARCHAR(100) NOT NULL, numero INTEGER NOT NULL, cidade VARCHAR(50) NOT NULL, cep VARCHAR(10) NOT NULL, FOREIGN KEY (id_cliente) REFERENCES cliente(id) )

4. **Desafio**: Como você faria para garantir que o `email` de um cliente sempre contenha o caractere `@`? (Dica: use a constraint `CHECK`).